rfkill子系统

154次阅读

共计 2326 个字符,预计需要花费 6 分钟才能阅读完成。

https://www.cnblogs.com/zyly/p/17453829.html

一、rfkill 子系统

1.1 rfkill 概述

rfki 是 Linux 内核提供的一个框架,用于控制无线通信硬件(如 WiFi、蓝牙、NFC 等)的开关和状态。rfkll 就是 RF(射频)设备的开关,有类似一键关闭所有射频外设的功能 rki 的出现方便管理各种 RF 芯片的开关,目前已经很多厂商的设备使用的是 rfkill 的驱动来管理一些无线设备的电源了,都是和 RF 相关的芯片,比如 WiFi,蓝牙,NFC,FM,GPS 等等。
由于这个 rfkill 的功能是管理无线设备的电源开关,所以这和硬件的关联是直接的,一般都会涉及到硬件的 power 或 reset 引脚。
rfkill 子系统有 ”hard” 和 ”soft”blocked 的概念,blocked 的意思就是发射器关闭
·soft blocked::表示软件层面对无线设备进行的阻止(比如说,通过运行 rkl 激活命令)。在这种情况下,无线电器的硬件电源依旧是打开的,只是被软件控制给关掉了;
·hard blocked:表示硬件层面对无线设备进行的阻止,通常是由于硬件按键或者物理开关进行的关闭。在这种情况下,即使在操作系统层面执行启动命令,也无法使无线电器工作;区别在于软硬件控制的不同。soft blocked 是软件层面的禁用,硬件还是打开的,可以通过命令解除禁用;而 hard blocked 是硬件层面的禁用,无论从软件还是命令层面都无法解除。

1.2rfkill 子系统框架

rfkill 子系统主要三个部分组成:
了 rfkill 工具,用于开启和关闭无线设备功能;
·rfkill input 模块:输入层处理程序,不推荐使用的,已由用户空间策略代码代替;
·rfkill 驱动程序:需要实现不同芯片的 rkfill 驱动程序;比如我们需要提供 AP6356 的 rfkill 驱动程序,实现 AP6356 设备的开启和关闭;我们要做的一般是调试厂商已经做好的 rfkill 驱动,或者我们自己实现 API 的接口,这个并不难,其实最终就是操作 GPIO 引脚。
1.2.1rfkill 命令查看无线设备在 linux 系统下可以通过 rfkill 工具查看无线设备的功能:

root@rk3399:/lib/modules# rfkill list
0: bt_default: Bluetooth
Soft blocked: yes
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
root@rk3399:/lib/modules# rfkill
ID TYPE DEVICE SOFT HARD
0 bluetooth bt_default blocked unblocked
1 wlan phy0 unblocked unblocked

 

这里看到有两个无线设备,一个是蓝牙的,另一个 WiFi 的,蓝牙设备默认是禁用的。
1.2.2 开启关闭无线设备

我们可以通过执行如下命令开启蓝牙设备;

root@rk3399:/lib/modules# rfkill unblock 0
root@rk3399:/lib/modules# rfkill list
0: bt_default: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no

 

同样我们可以通过命令关闭 WiFi 设备,可以看到当关闭 WiFi 设备后,就无法通过 ifconfig 看到设备了;

root@rk3399:/lib/modules# rfkill block 1
root@rk3399:/lib/modules# rfkill list
0: bt_default: Bluetooth
Soft blocked: no
Hard blocked: no
1: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
root@rk3399:/lib/modules# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.255
ether 92:a7:05:0f:19:86 txqueuelen 1000 (Ethernet)
RX packets 719 bytes 677554 (677.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 438 bytes 36520 (36.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 24

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 195 bytes 15221 (15.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 195 bytes 15221 (15.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

此时我们通过 ifconfig wlan0 up 命令是无法启用 WiFi 的;

root@rk3399:/lib/modules# ifconfig wlan0 up
SIOCSIFFLAGS: Operation not possible due to RF-kill

 

 

 

 

正文完
 0